{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "# 第一个记忆组件\n",
    "\n",
    "首先，我们需要引入 `ConversationTokenBufferMemory` 类，并创建一个 `OpenAI` 类的实例作为其参数。 `ConversationTokenBufferMemory` 是一个记忆组件，它将最近的交互信息保存在内存中，并使用令牌长度而不是交互次数来决定何时清除交互信息。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.memory import ConversationTokenBufferMemory\n",
    "from langchain.llms import OpenAI\n",
    "openai_api_key = ''\n",
    "llm = OpenAI(openai_api_key=openai_api_key)\n",
    "memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=1000,memory_key=\"session_chat\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "在上面的代码中，我们首先创建了一个 `OpenAI` 实例 `llm`，然后用这个实例和一个 `max_token_limit` 参数来创建 `ConversationTokenBufferMemory` 的实例 `memory`。 `max_token_limit` 参数用于设置记忆组件可以保存的最大令牌数量。\n",
    "\n",
    "接下来，我们可以使用 `save_context` 方法来将聊天记录保存到记忆组件中。每次调用 `save_context`，都会将一次交互（包括用户的输入和大语言模型的输出）添加到记忆组件的缓冲区中。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "memory.save_context({\"input\": \"你好！我是李特丽，这是人类的第一个消息\"}, {\"output\": \"你好！我是AI助理的第一个消息\"})\n",
    "memory.save_context({\"input\": \"今天心情怎么样\"}, {\"output\": \"我很开心认识你\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "memory"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "在上面的代码中，我们先后保存了两次交互记录。第一次交互中，用户的输入是 \"hi\"，大语言模型的输出是 \"whats up\"；第二次交互中，用户的输入是 \"not much you\"，大语言模型的输出是 \"not much\"。\n",
    "\n",
    "最后，我们可以使用 `load_memory_variables` 方法来加载记忆组件中的聊天记录。这个方法会返回一个字典，其中包含了记忆组件当前保存的所有聊天记录。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'session_chat': 'Human: 你好！我是李特丽，这是人类的第一个消息\\nAI: 你好！我是AI助理的第一个消息\\nHuman: 今天心情怎么样\\nAI: 我很开心认识你'}"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "memory.load_memory_variables({})"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "以上就是如何使用 `ConversationTokenBufferMemory` 记忆组件的示例。通过这个例子，我们可以看到如何实例化一个记忆组件，以及如何使用记忆组件的保存和加载方法来管理聊天记录。这种使用记忆组件的方式对于所有的记忆组件都是通用的，只是在具体的实现细节上可能会有所不同。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
